package com.fancy.music.service;

import com.fancy.common.dto.PageResult;
import com.fancy.common.dto.SongBasicInfo;
import com.fancy.music.dto.GlobalSearchResultDTO;
import com.fancy.music.dto.SongDetailDTO;
import com.fancy.music.entity.Song;

import java.util.List;

public interface SongService {

    /**
     * 根据ID获取歌曲详情
     */
    Song getSongDetail(Long songId);

    /**
     * 根据ID获取歌曲详情（包含专辑名和歌手名）
     */
    SongDetailDTO getSongDetailWithInfo(Long songId);

    /**
     * 搜索歌曲
     */
    PageResult<Song> searchSongs(String keyword, String genre, String language, Integer isVip, int page, int size);

    /**
     * 获取热门歌曲
     */
    List<Song> getHotSongs(Integer limit);

    /**
     * 获取新歌
     */
    List<Song> getNewSongs(Integer limit);

    /**
     * 根据歌手ID获取歌曲
     */
    List<Song> getSongsByArtistId(Long artistId);

    /**
     * 根据专辑ID获取歌曲
     */
    List<Song> getSongsByAlbumId(Long albumId);

    /**
     * 播放歌曲
     */
    String playSong(Long songId, Long userId);

    /**
     * 获取歌曲基本信息
     */
    SongBasicInfo getSongBasicInfo(Long songId);

    /**
     * 批量获取歌曲基本信息
     */
    List<SongBasicInfo> getSongBasicInfoBatch(List<Long> songIds);

    /**
     * 检查歌曲是否为VIP歌曲
     */
    boolean isVipSong(Long songId);

    /**
     * 记录播放统计
     */
    void recordPlayStats(Long songId);

    /**
     * 创建歌曲
     */
    Long createSong(Song song);

    /**
     * 更新歌曲信息
     */
    boolean updateSong(Song song);

    /**
     * 删除歌曲
     */
    boolean deleteSong(Long songId);

    /**
     * 审核歌曲
     */
    boolean auditSong(Long songId, Integer auditStatus, String auditRemark);

    /**
     * 获取推荐歌曲
     */
    List<Song> getRecommendedSongs(Long userId, Integer limit);

    /**
     * 获取新歌（包含完整信息）
     */
    List<SongDetailDTO> getNewSongsWithDetails(Integer limit);

    /**
     * 获取热门歌曲（包含完整信息）
     */
    List<SongDetailDTO> getHotSongsWithDetails(Integer limit);

    /**
     * 搜索歌曲（包含完整信息）
     */
    PageResult<SongDetailDTO> searchSongsWithDetails(String keyword, String genre, String language, Integer isVip, int page, int size);

    /**
     * 获取推荐歌曲（包含完整信息）
     */
    List<SongDetailDTO> getRecommendedSongsWithDetails(Long userId, Integer limit);

    /**
     * 根据歌手ID获取歌曲（包含完整信息）
     */
    List<SongDetailDTO> getSongsByArtistIdWithDetails(Long artistId);

    /**
     * 根据专辑ID获取歌曲（包含完整信息）
     */
    List<SongDetailDTO> getSongsByAlbumIdWithDetails(Long albumId);

    /**
     * 获取所有歌曲的音乐风格
     */
    List<String> getAllSongGenres();

    /**
     * 根据音乐风格获取歌曲（支持部分匹配）
     */
    List<Song> getSongsByGenreMatch(String genre, Integer limit);

    /**
     * 根据音乐风格获取歌曲（包含完整信息，支持部分匹配）
     */
    List<SongDetailDTO> getSongsByGenreMatchWithDetails(String genre, Integer limit);

    /**
     * 全局搜索（包含歌曲、歌手、专辑）
     */
    GlobalSearchResultDTO globalSearch(String keyword, Integer limit);
}
